package br.com.digidata.modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import br.com.digidata.negocio.Endereco;
import br.com.digidata.negocio.Medico;

public class MedicoDAO {
	private Connection conn;
	
	private int lastInsertId() {
		int id = -1;
		
        try {
        	
            PreparedStatement stmt = conn.prepareStatement("SELECT last_insert_id() AS id");

            ResultSet rs = stmt.executeQuery();            
            
            rs.next();
            
            id = rs.getInt("id");
                            
            rs.close();
            stmt.close();
            
        } catch (Exception e) {
            System.out.println("Id medico: " + new java.util.Date() + " " + e);
        }
        
        return id;
	}
	
	public boolean insert(Medico m) {
        conn = ConexaoBD.getConnection();
        boolean retorno = false;

		try {
			PreparedStatement pstmtEndereco = conn.prepareStatement("INSERT INTO endereco " +
					"(logradouro, numero, complemento, bairro, cidade, estado, cep) " +
					"values (?,?,?,?,?,?,?)");
			
			pstmtEndereco.setString(1, m.getEndereco().getLogradouro());
			pstmtEndereco.setInt(2, m.getEndereco().getNumero());
			pstmtEndereco.setString(3, m.getEndereco().getComplemento());
			pstmtEndereco.setString(4, m.getEndereco().getBairro());
			pstmtEndereco.setString(5, m.getEndereco().getCidade());
			pstmtEndereco.setString(6, m.getEndereco().getEstado());
			pstmtEndereco.setString(7, m.getEndereco().getCep());

			pstmtEndereco.executeUpdate();
			
			PreparedStatement pstmtMedico = conn.prepareStatement("INSERT INTO medico " +
					"(endereco_id, cpf, nome, data_nascimento, sexo, telefone_residencial, " +
					"telefone_celular, crm, especialidade) " +
					"values (?,?,?,?,?,?,?,?,?)");
			
			pstmtMedico.setInt(1, this.lastInsertId());
            pstmtMedico.setString(2, m.getCpf());
            pstmtMedico.setString(3, m.getNome());
            pstmtMedico.setString(4, m.getDataNascimento());
            pstmtMedico.setString(5, m.getSexo());
            pstmtMedico.setString(6, m.getTelefoneResidencial());
            pstmtMedico.setString(7, m.getTelefoneCelular());
            pstmtMedico.setInt(8, m.getCrm());
            pstmtMedico.setString(9, m.getEspecialidade());
           
			pstmtMedico.executeUpdate();
			
		    retorno = true;
			
		    pstmtEndereco.close();
			pstmtMedico.close();
			conn.close();
		} catch (SQLException e) {
			System.out.println("Incluir medico: " + new java.util.Date() + " " + e);
		}
		return retorno;
	}

	public void update(Medico m) {
		try{
            conn = ConexaoBD.getConnection();
            
            PreparedStatement stmt = conn.prepareStatement("UPDATE medico SET especialidade = ?, telefone_celular = ? WHERE id = ? ");
            stmt.setString(1, m.getEspecialidade());
            stmt.setString(2, m.getTelefoneCelular());
            stmt.setInt(3, m.getId());
            stmt.executeUpdate();
            
            stmt.close();
            conn.close();
            
        } catch (Exception e){
            System.out.println("Alterar medico: " + new java.util.Date() + " " + e);
        }
	}
	
	public List<Medico> retrive(){
        List<Medico> medicos = new ArrayList<Medico>();
        
        try {
            conn = ConexaoBD.getConnection();
        	
            Statement stmt = conn.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT * FROM medico m JOIN endereco e ON m.endereco_id = e.id");
            
            while (rs.next()) {
            	Endereco endereco = new Endereco(rs.getInt("endereco_id"), 
            			rs.getString("logradouro"), 
            			rs.getInt("numero"), 
            			rs.getString("complemento"), 
            			rs.getString("bairro"), 
            			rs.getString("cidade"), 
            			rs.getString("estado"), 
            			rs.getString("cep"));
            	
                Medico medico = new Medico(rs.getInt("id"), 
                		rs.getString("cpf"), 
                		rs.getString("nome"), 
                		rs.getString("data_nascimento"), 
                		rs.getString("sexo"),
                		rs.getString("telefone_residencial"),
                		rs.getString("telefone_celular"), 
                		endereco, 
                		rs.getInt("crm"), 
                		rs.getString("especialidade"));
                
                medicos.add(medico);
            }
            
            rs.close();
            stmt.close();
            conn.close();
            
        } catch (Exception e) {
            System.out.println("Listar medicos: " + new java.util.Date() + " " + e);
        }
        
        return medicos;
    }
	
	public Medico getById(int id) {
    
		Medico medico = null;
		
        try {
            conn = ConexaoBD.getConnection();
        	
            PreparedStatement stmt = conn.prepareStatement("SELECT * FROM medico m JOIN endereco e ON m.endereco_id = e.id WHERE m.id = ? ");
            stmt.setInt(1, id);

            ResultSet rs = stmt.executeQuery();            
            
            rs.next();
            
        	Endereco endereco = new Endereco(rs.getInt("id"), 
        			rs.getString("logradouro"), 
        			rs.getInt("numero"), 
        			rs.getString("complemento"), 
        			rs.getString("bairro"), 
        			rs.getString("cidade"), 
        			rs.getString("estado"), 
        			rs.getString("cep"));
        	
            medico = new Medico(rs.getInt("id"), 
            		rs.getString("cpf"), 
            		rs.getString("nome"), 
            		rs.getString("data_nascimento"), 
            		rs.getString("sexo"),
            		rs.getString("telefone_residencial"),
            		rs.getString("telefone_celular"), 
            		endereco, 
            		rs.getInt("crm"), 
            		rs.getString("especialidade"));
                            
            rs.close();
            stmt.close();
            conn.close();
            
        } catch (Exception e) {
            System.out.println("Pegar medicos: " + new java.util.Date() + " " + e);
        }
        
        return medico;	
	}
}
